package com.dbms.parser.ast;

import com.dbms.common.Constants;
import com.dbms.common.Position;

/**
 * DeleteNode (删除节点) 代表了 `DELETE` 语句的抽象语法树 (AST) 结构。
 * 【已修改】这个版本的 `whereClause` 字段从简单的 String 类型升级为 ExpressionNode 类型，
 * 这使得解析器可以更好地捕捉和表示 WHERE 子句的结构化信息（如操作符和操作数），
 * 而不仅仅是将其作为一个原始字符串。
 */
public class DeleteNode extends StatementNode {
    /**
     * 要删除数据的表的名称。
     */
    private final String tableName;
    /**
     * 【关键修改】WHERE 子句。类型从 String 改为 ExpressionNode，以结构化地存储条件。
     */
    private final ExpressionNode whereClause;

    /**
     * 【关键修改】构造函数参数类型变更。
     * @param position 语句在原始 SQL 中的位置
     * @param tableName 表名
     * @param whereClause 代表 WHERE 条件的表达式节点
     */
    public DeleteNode(Position position, String tableName, ExpressionNode whereClause) {
        super(position);
        this.tableName = tableName;
        this.whereClause = whereClause;
    }

    /**
     * 返回语句的类型标识。
     * @return "Delete" 常量
     */
    @Override
    public String getStatementType() {
        return Constants.STATEMENT_DELETE;
    }

    /**
     * 获取表名。
     * @return 表名字符串
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 【关键修改】Getter 返回类型变更。
     * @return 代表 WHERE 条件的 ExpressionNode
     */
    public ExpressionNode getWhereClause() {
        return whereClause;
    }

    /**
     * 生成该节点的字符串表示，方便调试。
     * @return 描述该节点的字符串
     */
    @Override
    public String toString() {
        // 更新 toString 方法以优雅地处理可能为 null 的 whereClause
        return "DeleteNode{\n" +
                "    tableName='" + tableName + "',\n" +
                "    whereClause='" + (whereClause != null ? whereClause.toString() : "无") + "'\n" +
                "}";
    }
}